// function Person (name) {
//   if (this instanceof Person) {
//     this.name = name
//   } else {
//     throw new Error('必须通过new关键字调用Person')
//   }
// }
// var person = new Person('李四')
// var notPerson = Person('李四') // 抛出错误
// var notPerson2 = Person.call(person, '李四') // 无异常！
// function Person (name) {
//   if (typeof new.target !== 'undefined')
//     this.name = name
//   else
//   throw new Error('必须通过new关键字调用Person')
// }
// var person = new Person('李四')
// var notPerson = Person.call(person, '李四') // 抛出错误

// function Person (name) {
//   if (new.target === Person)
//     this.name = name
//   else
//   throw new Error('必须通过new关键字调用Person')
// }
// function AnotherPerson (name) {
//   Person.call(this, name)
// }
// var person = new Person('李四')
// var anotherPerson = new AnotherPerson('李四') // 报错

// if (true) {
//   console.log(typeof test) // 抛出错误
//   let test = function () {}
//   test()
//   console.log(typeof test) // function
// }

// const test = () => {
//   // do something
// }

// const test = value => value
// // 转为非箭头函数就是
// const test = function (value) {
//   return value
// }

// const add = (a, b) => a + b
// const add = function (a, b) {
//   return a + b
// }

// const getName = () => '李四'
// const getName = function () {
//   return '李四'
// }

// const add = (a, b) => {
//   return a + b
// }

// const getGirlFriend = name => ({name: name, age: 20})
// console.log(getGirlFriend('周芷若')) // { name: '周芷若', age: 20 }
// const getGirlFriend = function (name) {
//   return {name: name, age: 20}
// }

// const person = (name => {
//   return {
//     getGirlFriend: function () {
//       return {name: name, age: 20}
//     }
//   }
// })('周芷若')
// console.log(person.getGirlFriend()) // { name: '周芷若', age: 20 }

// const arr = [10, 20, 5]
// const sort = arr.sort((a, b) => b - a)
// console.log(arr) // [ 20, 10, 5 ]

// function test1 () {
//   return 1
// }
// function test2 () {
//   return test1() // 会被优化
// }
// function test3 () {
//   test1() // 不会被优化
// }
// function test4 () {
//   return 1 + test1() // 不会被优化
// }
// function test5 () {
//   const num = 1 + test1()
//   return num // 不会被优化
// }
// function test6 () {
//   const num = 1,
//   func = () => num
//   return func() // 不会被优化，因为它是闭包
// }

// function test (n) {
//   if (n <= 1) {
//     return 1
//   } else {
//     // 不会被优化
//     return n * test(n - 1)
//   }
// }

// function test (n, p = 1) {
//   if (n <= 1) {
//     return 1 * p
//   } else {
//     let result = n * p
//     // 会被优化
//     return test(n - 1, result)
//   }
// }